package org.zoomdev.zoom.dao;

import org.zoomdev.zoom.common.expression.Symbol;
import org.zoomdev.zoom.common.utils.Page;

import java.util.List;

public interface Ar<T> {

    Ar<T> select(String select);

    Ar<T> where(String key, Object value);

    /**
     * join("order","order.id=product.id")=> inner join order on order.id=product.id
     *
     * @param table
     * @param on
     * @return
     */
    Ar<T> join(String table, String on);


    Ar<T> where(String key, Symbol symbol, Object value);

    /**
     * 设置一个数据
     *
     * @param data
     */
    Ar<T> set(T data);

    /**
     * 设置一个表达式
     * <p>
     * set("count=count+?",1)
     *
     * @return
     */
    Ar<T> setExpression(String exp, Object... args);


    /**
     * 设置数据属性，假如set方法没有被调用，则会新建一个数据
     *
     * @param key
     * @param value
     * @return
     */
    Ar<T> set(String key, Object value);


    /**
     * 查找
     *
     * @return
     */
    List<T> find();

    /**
     * 支持原始sql
     * 计划中... , 使用select xx from 的 xx 进行关联entity
     *
     * @param sql
     * @param args
     * @return
     */
    List<T> query(String sql, Object... args);

    Page<T> position(int position, int size);

    Page<T> page(int page, int size);


    /**
     * 获取某个值
     * ar.value("name",String.class)
     *
     * @param key
     * @param typeOfE
     * @param <E>
     * @return
     */
    <E> E value(String key, Class<E> typeOfE);


    /**
     * 获取多个统计值
     * ar.statistics( Statistics.MIN.toSelect("id"), Statistics.MAX.toSelect("id"), SqlBuilder.COUNT);
     * ar.statistics("count(*),max(id),min(id)");
     *
     * @param keys
     * @return
     */
    List<Object> values(String... keys);

    int count();

    /**
     * limit 查询
     *
     * @param position 开始位置，从0开始
     * @param limit    限制数量
     * @return
     */
    List<T> limit(int position, int limit);

    /**
     * 获取一个
     *
     * @param args
     * @return
     */
    T get(Object... args);

    /**
     * 获取一个，必须使用 where设置条件
     *
     * @return
     */
    T get();

    /**
     * 更新
     *
     * @param sql
     * @param args
     * @return
     */
    int executeUpdate(String sql, Object... args);

    Ar entity(Entity entity);
}
